package com.minigame.common;

import com.sun.istack.internal.NotNull;

import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Function;

import static java.util.stream.Collectors.groupingBy;
import static java.util.stream.Collectors.toList;

public class CompareUtil {

    /**
     *
     * @param sortedList 有序集合
     * @param classifier 分组方式
     * @param <T> 集合泛型
     * @param <K> 分组字段类型
     * @return 排名map, 保留间隔,如: 1 22 4 55 7
     */
    public static <T, K> Map<T, Integer> rankMap(@NotNull List<T> sortedList, @NotNull Function<? super T, ? extends K> classifier) {
        return rankMap(sortedList, classifier, true);
    }

    /**
     *
     * @param sortedList 有序集合
     * @param classifier 分组方式
     * @param retainGap 是否保留间隔,如: 1 22 4 55 7
     * @param <T> 集合泛型
     * @param <K> 分组字段类型
     * @return 排名map
     */
    public static <T, K> Map<T, Integer> rankMap(@NotNull List<T> sortedList, @NotNull Function<? super T, ? extends K> classifier, boolean retainGap) {
        Map<K, List<T>> groups = sortedList.stream().collect(groupingBy(classifier, LinkedHashMap::new, toList()));
        Map<T, Integer> rankMap = new HashMap<>();
        int rank = 1;
        for (List<T> group : groups.values()) {
            for (T t : group) {
                rankMap.put(t, rank);
            }
            rank += retainGap ? group.size() : 1;
        }
        return rankMap;
    }
}
